package com.hspedu.map_;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author DL5O
 * @version 1.0
 */
public class MapSource_ {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("no1","ywl");
        map.put("no2","张无忌");
        map.put(new Car(),new Person());//k-v
        //1. k-v 最后是 HashMap$Node node = new Node(hash,key,value,null);
        //2. k-v 为了方便程序员的遍历，还会创建EntrySet集合，该集合存放的元素的类型就是 Entry
        //   而一个Entry对象就有 k,v EntrySet<Entry<K,V>>
        //   即：Set<Map.Entry<K,V>> entrySet()
        //3. 在entrySet中，定义的类型是一个Map.Entry，但是它实际上还是存放的是HashMap$Node(实现了向上转型)
        //   这里因为HashMap&Node implements Map.Entry
        //4. 当把 HashMap$Node 对象 存放在 entrySet 就方便我们遍历，
        //   因为Map.Entry提供了两个重要的方法
        //   K getKey() 和 V getValue();
        Set set = map.entrySet();
        System.out.println(set.getClass());//class java.util.HashMap$EntrySet
        for (Object obj : set ) {

            //System.out.println(entry.getClass());//class java.util.HashMap$Node
            //为了从 HashMap$Node 取出k-v
            // 1.先做一个向下转型
            Map.Entry entry = (Map.Entry) obj;
            System.out.println(entry.getKey() + "-"+entry.getValue());
            /*
            class java.util.HashMap$EntrySet
            no2-张无忌
            no1-ywl
             */
        }

        /*
            class java.util.HashMap$Node
            class java.util.HashMap$Node
        */

        Set set1 = map.keySet();//keySet可以封装到一个Set集合里面去的
        Collection values = map.values();//values可以封装到一个Collection集合里面去
        System.out.println(set1.getClass());//class java.util.HashMap$KeySet
        System.out.println(values.getClass());//class java.util.HashMap$Values
        System.out.println(set1);
        System.out.println(values);
        /*
        class java.util.HashMap$EntrySet
        no2-张无忌
        no1-ywl
        com.hspedu.map_.Car@2133c8f8-com.hspedu.map_.Person@7a5d012c
        class java.util.HashMap$KeySet
        class java.util.HashMap$Values
        [no2, no1, com.hspedu.map_.Car@2133c8f8]
        [张无忌, ywl, com.hspedu.map_.Person@7a5d012c]
         */
    }
}

class Car{

}

class Person{

}
